package cz.vse.po1715.piskorky.umela_inteligence;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;

/*******************************************************************************
 * Instance třídy {@code TestUI} představuje testovací třídu pro umělou inteligenci
 *      ke hře Piškvorky
 *
 * @author    Vladimír FOREJT
 * @version   0.00.000
 */
public class TestUI {
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
    
    private final Point rozměrPole = new Point (15,15);
    
    /** Hlavní okno */
    private final JFrame appWindow = new JFrame("První okno");
    
    /** Hrací pole */
    private final JPanel hracíPole = new JPanel();
    
    /** Panel s ovládáním */
    private final JPanel ovládání = new JPanel();
    
    /**List Políček */
    private final List<JButton> políčka;
    
    private final int početPolí;
    
    private final JButton hraj = new JButton("Další tah");
    
    
    
    /** Posluchač události stisku tlačítka v panelu. */
    private final ActionListener listener = new ButtonListener();
    
    /** Instance umělé inteligence */
    private final UměláInteligence ai;
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
    
    //* počet odehraných tahů - pomocná proměnná pro střídání hráčů */
    private int početTahů = 0;
    
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    /***************************************************************************
     *
     */
    public TestUI() {
        ai = new UměláInteligence(rozměrPole);
        početPolí = rozměrPole.x * rozměrPole.y;
        
        políčka = new ArrayList<JButton>(početPolí);
        //Připravit vrchní část s hracím polem
        hracíPole.setLayout(new GridLayout(rozměrPole.x, rozměrPole.y));
        for(int i = 0; i < početPolí; i++) {
            JButton políčko = new JButton(" ");
            políčko.setSize(10, 10);
            políčka.add(políčko);
        }
        for(JButton políčko : políčka) {
            hracíPole.add(políčko);
        }
        //Spodní část s ovládáním
        hraj.addActionListener(listener);
        ovládání.add(hraj);
        
        appWindow.add(hracíPole, BorderLayout.NORTH);
        appWindow.add(ovládání, BorderLayout.SOUTH);
        appWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        appWindow.pack();
        appWindow.setVisible(true);
        
    }
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
    
    /***************************************************************************
     * Posluchač reagující na stisk tlačítka tím,
     * že vyvolá příkaz s názvem tlačítka jako jeho parametrem.
     */
    private class ButtonListener implements ActionListener
    {
        /***********************************************************************
         * Zadá příkaz, jehož parametrem bude nápis na tlačítku.
         *
         * @param event Ohlášená událost, od níž zjistíme nápis na tlačítku
         */
        @Override
        public void actionPerformed(ActionEvent event)
        {
            
            if (početTahů % 2 == 1) {
                int indexČlověka = ai.souřadnice2index(ai.napověz());
                políčka.get(indexČlověka).setText("X");
            } else {
                Point tahPočítač;
                if (početTahů == 0) {
                    tahPočítač = ai.začniHru();
                } else {
                    tahPočítač = ai.hraj(ai.napověz());
                }    
                int indexPočítač = ai.souřadnice2index(tahPočítač);
                políčka.get(indexPočítač).setText("O");
            }
            početTahů++;
            
                        
        }

    }
    
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        TestUI inst = new TestUI();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {
        new TestUI();  
    }
}
